import com.sun.xml.internal.ws.util.StringUtils;

/**
 * @author: chenzhidiao
 * @date: 2021/5/3 10:01
 * @description:
 * 1.定义主类的属性
 * 2.主类内部定义一个Builder类，其属性值和主类的属性一致
 * 3.定义主类的构造函数，其参数为Builder内部类类型，设置主类的属性值为Builder参数对象的属性值
 * 4.内部类定义一个build()方法，返回一个主类类型的对象
 * 5.内部类定义各种set() 方法，用于设置Builder对象的各个属性，方法的返回值类型为内部类Builder类型
 * 6.通过 new 主类.Builder().setA().setB().build() 方法来创建主类对象
 * @version: 1.0
 */
public class Student {
    //1.定义主类的属性
    private int id;
    private String name;
    private int age;

    //3.定义主类的构造方法，其参数为Builder内部类类型，设置主类的属性值为Builder参数对象的属性值
    public Student(Builder builder) {
        this.id=builder.id;
        this.name= builder.name;
        this.age = builder.age;
    }

    //2.定义内部Builder类，其属性和主类的属性一致
    public static class Builder{

        private String name;
        private int id;
        private int age;

        //4.内部类定义一个build()方法，返回一个主类类型的对象,
        public Student build(){
            // 校验逻辑放到这里来做，包括必填项校验、依赖关系校验、约束条件校验等
            if (name==null||"".equals(name)){
                throw new IllegalArgumentException("请输入正确的name属性");
            }
            return new Student(this);
        }

        //5.内部类定义各种set() 方法，用于设置Builder对象的各个属性，方法的返回值类型为内部类Builder类型
        public Builder setName(String name){
            this.name=name;
            return this;
        }

        public Builder setId(int id){
            this.id=id;
            return this;
        }

        public Builder setAge(int age){
            this.age=age;
            return this;
        }

    }

    //6.通过 new 主类.Builder().setA().setB().build() 方法来创建主类对象
    Student stu = new Student.Builder().setAge(12).setName("diao").setId(1).build();

}
